package aop.annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

//方式三：使用注解方式实现AOP
@Aspect  //标注这个类是一个切面
public class AnnotationPointCut {
    //aop包下的service包下的impl包下面的UserServiceImpl接口下的所有方法，参数不限
    //前置增强
     @Before("execution(* aop.service.impl.UserServiceImpl.*(..))")
      public void before(){
       System.out.println("===========方法执行前===========");
      }

      //后置增强
    @After("execution(* aop.service.impl.UserServiceImpl.*(..))")
    public void after(){
       System.out.println("===========方法执行后===========");
    }

    //环绕增强
 //当定义了前置增强，又定义了后置增强，在定义了环绕增强，执行顺序分别是：
// 环绕前，方法执行前，增加了一个用户，环绕后，方法执行后
    @Around("execution(* aop.service.impl.UserServiceImpl.*(..))")
    public void around(ProceedingJoinPoint jp)throws Throwable{
      System.out.println("---------环绕前-------");
      Object proceed=jp.proceed(); //执行方法
     Signature singnature= jp.getSignature(); //获得签名
     System.out.println(singnature);
      System.out.println("---------环绕后-------");
    }
}
